package FulbitoFacil.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import FulbitoFacil.excepcion.DAOExcepcion;
import FulbitoFacil.modelo.Persona;
import FulbitoFacil.util.ConexionBD;

public class PersonaDAO extends BaseDAO {

	public void insertar(Persona per) throws DAOExcepcion {
		System.out.println("PersonaDAO: insertar(Persona per)");
		String query = "INSERT INTO Persona(tipoPers,nombres,paterno,materno,sexo,tipoDoc,numDoc,email,pass,fecNac,celular) VALUES (?,?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, per.getIdPersona());
			stmt.setString(1, per.getTipoPers());
			stmt.setString(2, per.getNombres());
			stmt.setString(3, per.getApePaterno());
			stmt.setString(4, per.getApeMaterno());
			stmt.setString(5, per.getSexo());
			stmt.setString(6, per.getTipoDoc());
			stmt.setString(7, per.getNumDoc());
			stmt.setString(8, per.getCorreo());
			stmt.setString(9, per.getPassword());
			stmt.setString(10, per.getFecNac());
			stmt.setString(11, per.getCel());

			/*
			 * Mensaje de error si el usuario ya existe (el Documento de identidad y el correo deben ser unicos).- 
			 * realizar una comparacion con la base de datos del usuario, documennto de identidad y correo 
			*/

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			} else {
				System.out.println("El registro fue ingresado correctamente");//Confirmacion del registro OK
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Collection<Persona> buscarPorNombre(String nombre)
			throws DAOExcepcion {
		System.out.println("PersonaDAO: buscarPorNombre(String nombre)");
		String query = "SELECT nombres FROM Persona WHERE nombres like ?";
		Collection<Persona> lista = new ArrayList<Persona>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Persona per = new Persona();
				per.setNombres(rs.getString("nombres"));
				//per.setApePaterno(rs.getString("descripcion"));
				lista.add(per);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public Persona buscarCorreo(String correo) throws DAOExcepcion {
		System.out.println("PersonaDAO: buscarCorreo(String correo)");
		Persona per = null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select nombres, paterno from Persona where correo=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, correo);
			rs = stmt.executeQuery();
			if (rs.next()) {
				per = new Persona();
				per.setNombres(rs.getString(1));
				per.setApePaterno(rs.getString(2));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return per;
	}
	
	 public Persona buscarCorreoClave(String correo, String clave) throws DAOExcepcion {
         System.out.println("PersonaDAO: buscarCorreoClave(String correo, String password)");
         Persona per = new Persona();
         Connection con = null;
         PreparedStatement stmt = null;
         ResultSet rs = null;
         try {
                 String query = "select id_Persona, tipoPers, nombres, paterno, materno, sexo, tipoDoc, numDoc, email, fecNac, celular from Persona where email=? and pass=?";
                
                 System.out.println(correo);
                 System.out.println(clave);
                 con = ConexionBD.obtenerConexion();
                 stmt = con.prepareStatement(query);
                 stmt.setString(1, correo);
                 stmt.setString(2, clave);
                 rs = stmt.executeQuery();
                 if (rs.next()) {
                         per = new Persona();
                         per.setIdPersona(rs.getInt(1));
                         per.setTipoPers(rs.getString(2));
                         per.setNombres(rs.getString(3));
                         per.setApePaterno(rs.getString(4));
                         per.setApeMaterno(rs.getString(5));
                         per.setSexo(rs.getString(6));
                         per.setTipoDoc(rs.getString(7));
                         per.setNumDoc(rs.getString(8));
                         per.setCorreo(rs.getString(9));
                         per.setFecNac(rs.getString(10));
                         per.setCel(rs.getString(11));
                 }
         } catch (SQLException e) {
                 System.err.println(e.getMessage());
                 throw new DAOExcepcion(e.getMessage());
         } finally {
                 this.cerrarResultSet(rs);
                 this.cerrarStatement(stmt);
                 this.cerrarConexion(con);
         }
         return per;
 }
	public Persona buscarNumDoc(String numDoc) throws DAOExcepcion {
		System.out.println("PersonaDAO: buscarNumDoc(String numDoc)");
		Persona per = null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select nombres, paterno from persona where numDoc=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, numDoc);
			rs = stmt.executeQuery();
			if (rs.next()) {
				per = new Persona();
				per.setNombres(rs.getString(1));
				per.setApePaterno(rs.getString(2));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return per;
	}

	public Persona obtener(String PersonaNombre) throws DAOExcepcion {
		System.out.println("PersonaDAO: obtener(String PersonaNombre)");
		Persona per = new Persona();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select nombres, descripcion from persona where nombres=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, PersonaNombre);
			rs = stmt.executeQuery();
			if (rs.next()) {
				per.setNombres(rs.getString(1));
				per.setApePaterno(rs.getString(2));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return per;
	}

	public void eliminar(String PersonaNombre) throws DAOExcepcion {
		System.out.println("PersonaDAO: eliminar(String PersonaNombre)");
		String query = "DELETE FROM persona WHERE nombres=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, PersonaNombre);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public void actualizar(Persona per) throws DAOExcepcion {
		System.out.println("PersonaDAO: actualizar(Persona per)");
		String query = "update persona set descripcion=? where nombres=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, per.getNombres());
			stmt.setString(2, per.getApePaterno());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Collection<Persona> listar() throws DAOExcepcion {
		System.out.println("PersonaDAO: listar()");
		Collection<Persona> c = new ArrayList<Persona>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT Persona_nombre,descripcion from Persona";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Persona per = new Persona();
				per.setNombres(rs.getString("Persona_nombre"));
				per.setApePaterno(rs.getString("descripcion"));
				c.add(per);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
}

